#!/usr/bin/python3

#### Import modules ####
import json
import time

import baostock as bs
import pandas as pd

################################################################################
# date        : 交易所行情日期
# code        : 证券代码
# open        : 开盘价
# close       : 收盘价
# high        : 最高价
# low         : 最低价
# preclose    : 前收盘价
# volume      : 成交量（累计 单位：股）
# amount      : 成交额（单位：人民币元）
# adjustflag  : 复权状态(1：后复权， 2：前复权，3：不复权）
# turn        : 换手率
# tradestatus : 交易状态(1：正常交易 0：停牌）
# pctChg      : 涨跌幅（百分比, 小数点后6位）
# peTTM       : 滚动市盈率(精度：小数点后6位)
# psTTM       : 滚动市销率(精度：小数点后6位)
# pcfNcfTTM   : 滚动市现率(精度：小数点后6位)
# pbMRQ       : 市净率(精度：小数点后6位)
# isST        : 是否ST(1是，0否)
################################################################################
G_K_INFO = 'date,code,open,high,low,close,preclose,volume,amount,adjustflag,\
    turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST'

################################################################################
# Class of Stock
################################################################################
class Stock(object):

    def __init__(self):
        self.__date = str('2018-01-01')
        self.__code = str('sh.000001')
        self.__isST = bool(False)
        pass

    # get and set date
    @property
    def date(self):
        return self.__date
    @date.setter
    def date(self, date):
        self.__date = date
    
    # get and set code id
    @property
    def code(self):
        return self.__code
    @code.setter
    def code(self, code : str):
        self.__code = code

    # get ST status
    @property
    def isST(self):
        return self.__isST

    def get_k(self):
        pass

    def get_basic(self):
        pass

    def get_day_info(self, day : str):
        pass

    # get MovingAvarage
    def ma(self, _cycle : int) -> float:
        rt = self.__get_k_history()

        cycle = _cycle

        for i in range(0, len(rt) - cycle):
            data = rt.iloc[i: i + (cycle), [0, 5]]
            avg = 0.0
            sum = 0.0

            for i in data.values:
                sum += float(i[1])

            print("%s : %0.3f" % (data.values[0][0], round(sum / cycle * 1.0, 3)))
            
        return 0.0

    ############################################################################
    # Get K information of stock 
    ############################################################################
    def __get_k_history(self, start : str = '2021-01-01', end = '2021-02-01'):
        print(self.__code)
        rs = bs.query_history_k_data_plus(self.__code, G_K_INFO, start_date=start, end_date=end, 
        frequency="d", adjustflag="3") #frequency="d"取日k线，adjustflag="3"默认不复权
        data_list = []

        while (rs.error_code == '0') & rs.next():
            data_list.append(rs.get_row_data())
        result = pd.DataFrame(data_list, columns=rs.fields)

        result = result.iloc[::-1]

        return result

################################################################################
# K line of stock
################################################################################
class K(object):
    def __init__(self):
        pass

################################################################################
# Login system
################################################################################
def login() -> None:
    lg = bs.login()

################################################################################
# Logout system
################################################################################
def logout() -> None:
    bs.logout()

################################################################################
# Get all stocks
# code        : 证券代码
# tradeStatus : 交易状态(1：正常交易 0：停牌）
# code_name   : 证券名称
################################################################################
def get_all(start_day : str = '2020-08-01') -> None:
    rs = bs.query_all_stock( day = start_day)

    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    
    result = pd.DataFrame(data_list, columns=rs.fields)
    print(result)

################################################################################
# Get date
################################################################################
def today() -> str:
    day = (time.strftime("%Y-%m-%d", time.localtime()))
    return day

################################################################################
# Debug log
################################################################################
def debug():
    print('debug')

################################################################################
# main
################################################################################
if __name__ == '__main__':
    login()
    # get_all()
    s = Stock()
    s.code = "sz.000001"
    s.ma(13)
    k = K()

    logout()
    pass
